home *** CD-ROM | disk | FTP | other *** search
/ Aminet 35 / Aminet 35 (2000)(Schatztruhe)[!][Feb 2000].iso / Aminet / game / shoot / ADescentSrc.lha / descent / Amiga / c2p_040.s < prev    next >
Text File  |  1998-03-22  |  12KB  |  546 lines

  1. ; Chunky2Planar algorithm, originally by James McCoull
  2. ; Modified by Peter McGavin for variable size and depth
  3. ; and "compare buffer" (hope I didn't slow it down too much)
  4. ;
  5. ;   Cpu only solution VERSION 2
  6. ;   Optimised for 040+fastram
  7. ;   bitplanes are assumed contiguous!
  8. ;   analyse instruction offsets to check performance
  9.  
  10. ;void __asm c2p_6_040 (register __a0 UBYTE *chunky_data,
  11. ;                      register __a1 PLANEPTR raster,
  12. ;                      register __a2 UBYTE *compare_buffer,
  13. ;                      register __a4 UBYTE *xlate,
  14. ;                      register __d1 ULONG plsiz,
  15. ;                      register __d2 BOOL force_update);
  16.  
  17. ;void __asm c2p_8_040 (register __a0 UBYTE *chunky_data,
  18. ;                      register __a1 PLANEPTR raster,
  19. ;                      register __a2 UBYTE *compare_buffer,
  20. ;                      register __d1 ULONG plsiz);
  21.  
  22. ; a0 -> width*height chunky pixels
  23. ; a1 -> contiguous bitplanes
  24. ; a2 -> compare buffer
  25. ; d1 = width*height/8   (width*height must be a multiple of 32)
  26.  
  27.     ifeq    depth-8
  28.         xdef    _c2p_8_040
  29. _c2p_8_040:
  30.     else
  31.     ifeq    depth-6
  32.         xdef    _c2p_6_040
  33. _c2p_6_040:
  34.     else
  35.         fail    "unsupported depth!"
  36.     endc
  37.     endc
  38.  
  39. merge       macro ; in1,in2,tmp3,tmp4,mask,shift
  40. ; \1 = abqr
  41. ; \2 = ijyz
  42.         move.l  \2,\4
  43.         move.l  #\5,\3
  44.         and.l   \3,\2   ; \2 = 0j0z
  45.         and.l   \1,\3   ; \3 = 0b0r
  46.         eor.l   \3,\1   ; \1 = a0q0
  47.         eor.l   \2,\4   ; \4 = i0y0
  48.         ifeq    \6-1
  49.         add.l   \3,\3
  50.         else
  51.         lsl.l   #\6,\3  ; \3 = b0r0
  52.         endc
  53.         lsr.l   #\6,\4  ; \4 = 0i0y
  54.         or.l    \3,\2   ; \2 = bjrz
  55.         or.l    \4,\1   ; \1 = aiqy
  56.         endm
  57.  
  58. xlate       macro   ; translate 4 8-bit pixels to 6-bit EHB
  59.         move.b  (\1,a0),d7
  60.         move.b  (a4,d7.w),\2
  61.         lsl.w   #8,\2
  62.         move.b  (\1+8,a0),d7
  63.         move.b  (a4,d7.w),\2
  64.         swap    \2
  65.         move.b  (\1+16,a0),d7
  66.         move.b  (a4,d7.w),\2
  67.         lsl.w   #8,\2
  68.         move.b  (\1+24,a0),d7
  69.         move.b  (a4,d7.w),\2
  70.         endm
  71.  
  72. start:      movem.l d2-d7/a2-a6,-(sp)
  73.  
  74.         sub.w   #46,sp      ; space for temporary variables
  75.  
  76.     ifle depth-6
  77.         move.w  d2,(44,sp)  ; video_force_update
  78.     endc
  79.  
  80. ; a0 = chunky buffer
  81. ; a1 = output area
  82. ; a2 = compare buffer
  83. ; d1 = plsiz
  84.  
  85.         movea.l d1,a3       ; a3 = plsiz
  86.  
  87.         move.l  a0,(40,sp)
  88.         lsl.l   #3,d1
  89.         add.l   d1,(40,sp)  ; (40,sp) -> end of chunky data
  90.  
  91. first_loop:
  92.     ifle depth-6
  93.         tst.w   (44,sp)     ; force_update?
  94.         bne.b   first_case
  95.     endc
  96.         cmpm.l  (a0)+,(a2)+
  97.         bne.b   stub1
  98.         cmpm.l  (a0)+,(a2)+
  99.         bne.b   stub2
  100.         cmpm.l  (a0)+,(a2)+
  101.         bne.b   stub3
  102.         cmpm.l  (a0)+,(a2)+
  103.         bne.b   stub4
  104.         cmpm.l  (a0)+,(a2)+
  105.         bne.b   stub5
  106.         cmpm.l  (a0)+,(a2)+
  107.         bne.b   stub6
  108.         cmpm.l  (a0)+,(a2)+
  109.         bne.b   stub7
  110.         cmpm.l  (a0)+,(a2)+
  111.         bne.b   stub8
  112.  
  113.         addq.l  #4,a1       ; skip 32 pixels on output
  114.  
  115.         cmpa.l  (40,sp),a0
  116.         bcs.b   first_loop
  117.         bra.w   exit        ; exit if no changes found
  118.  
  119. stub8:      subq.l  #4,a0
  120.         subq.l  #4,a2
  121. stub7:      subq.l  #4,a0
  122.         subq.l  #4,a2
  123. stub6:      subq.l  #4,a0
  124.         subq.l  #4,a2
  125. stub5:      subq.l  #4,a0
  126.         subq.l  #4,a2
  127. stub4:      subq.l  #4,a0
  128.         subq.l  #4,a2
  129. stub3:      subq.l  #4,a0
  130.         subq.l  #4,a2
  131. stub2:      subq.l  #4,a0
  132.         subq.l  #4,a2
  133. stub1:      subq.l  #4,a0
  134.         subq.l  #4,a2
  135.  
  136. first_case:
  137.     ifgt depth-6        ; depth 8 code --- no need to xlate pixels
  138.         move.l  (0,a0),d1
  139.         move.l  (4,a0),d3
  140.         move.l  (8,a0),d0
  141.         move.l  (12,a0),d2
  142.         move.l  (2,a0),d4
  143.         move.l  (10,a0),d5
  144.         move.l  (6,a0),d6
  145.         move.l  (14,a0),d7
  146.  
  147.         move.l  d1,(0,a2)
  148.         move.l  d3,(4,a2)
  149.         move.l  d0,(8,a2)
  150.         move.l  d2,(12,a2)
  151.  
  152.         move.w  (16,a0),d1
  153.         move.w  (24,a0),d0
  154.         move.w  (20,a0),d3
  155.         move.w  (28,a0),d2
  156.         move.w  (18,a0),d4
  157.         move.w  (26,a0),d5
  158.         move.w  (22,a0),d6
  159.         move.w  (30,a0),d7
  160.  
  161.         move.w  d1,(16,a2)
  162.         move.w  d0,(24,a2)
  163.         move.w  d3,(20,a2)
  164.         move.w  d2,(28,a2)
  165.         move.w  d4,(18,a2)
  166.         move.w  d5,(26,a2)
  167.         move.w  d6,(22,a2)
  168.         move.w  d7,(30,a2)
  169.  
  170.         move.l  d6,a5
  171.         move.l  d7,a6
  172.  
  173.         merge   d1,d0,d6,d7,$00ff00ff,8
  174.         merge   d3,d2,d6,d7,$00ff00ff,8
  175.  
  176.         merge   d1,d3,d6,d7,$0f0f0f0f,4 
  177.         merge   d0,d2,d6,d7,$0f0f0f0f,4
  178.  
  179.         exg d1,a5
  180.         exg d0,a6
  181.  
  182.         merge   d4,d5,d6,d7,$00ff00ff,8
  183.         merge   d1,d0,d6,d7,$00ff00ff,8
  184.  
  185.         merge   d4,d1,d6,d7,$0f0f0f0f,4
  186.         merge   d5,d0,d6,d7,$0f0f0f0f,4
  187.  
  188.         merge   d3,d1,d6,d7,$33333333,2
  189.         merge   d2,d0,d6,d7,$33333333,2 
  190.  
  191.         merge   d3,d2,d6,d7,$55555555,1
  192.         merge   d1,d0,d6,d7,$55555555,1
  193.  
  194.         move.l  d0,(0*4,sp)     ;plane0 (movem.l is slower!)
  195.         move.l  d1,(1*4,sp)     ;plane1
  196.         move.l  d2,(2*4,sp)     ;plane2
  197.         move.l  d3,(3*4,sp)     ;plane3
  198.  
  199.         move.l  a5,d3
  200.         move.l  a6,d2
  201.  
  202.         merge   d3,d4,d6,d7,$33333333,2
  203.         merge   d2,d5,d6,d7,$33333333,2
  204.  
  205.         merge   d3,d2,d6,d7,$55555555,1
  206.         merge   d4,d5,d6,d7,$55555555,1
  207.  
  208.         move.l  d5,(4*4,sp)     ;plane4
  209.         move.l  d4,(5*4,sp)     ;plane5
  210.  
  211.         move.l  d2,(6*4,sp)     ;plane6
  212.         move.l  d3,(7*4,sp)     ;plane7
  213.  
  214.     else            ; depth 6 code, xlate from 8-bit to 6-bit EHB
  215.         moveq   #0,d7
  216.  
  217.         move.l  (a0),(a2)   ; copy to compare buffer
  218.         move.l  (4,a0),(4,a2)
  219.         move.l  (8,a0),(8,a2)
  220.         move.l  (12,a0),(12,a2)
  221.         move.l  (16,a0),(16,a2)
  222.         move.l  (20,a0),(20,a2)
  223.         move.l  (24,a0),(24,a2)
  224.         move.l  (28,a0),(28,a2)
  225.  
  226.         xlate   0,d1        ; does 8-bit to EHB colour translate
  227.         xlate   1,d0        ; 4 pixels at a time
  228.         xlate   4,d3
  229.         xlate   5,d2
  230.  
  231.         merge   d1,d3,d6,d7,$0f0f0f0f,4 
  232.         merge   d0,d2,d6,d7,$0f0f0f0f,4
  233.  
  234.         movea.l d1,a5
  235.         movea.l d0,a6
  236.  
  237.         moveq   #0,d7
  238.  
  239.         xlate   2,d4
  240.         xlate   3,d5
  241.         xlate   6,d1
  242.         xlate   7,d0
  243.  
  244.         merge   d4,d1,d6,d7,$0f0f0f0f,4
  245.         merge   d5,d0,d6,d7,$0f0f0f0f,4
  246.  
  247.         merge   d3,d1,d6,d7,$33333333,2
  248.         merge   d2,d0,d6,d7,$33333333,2 
  249.  
  250.         merge   d3,d2,d6,d7,$55555555,1
  251.         merge   d1,d0,d6,d7,$55555555,1
  252.  
  253.         move.l  d0,(0*4,sp)     ;plane0 (movem.l is slower!)
  254.         move.l  d1,(1*4,sp)     ;plane1
  255.         move.l  d2,(2*4,sp)     ;plane2
  256.         move.l  d3,(3*4,sp)     ;plane3
  257.  
  258.         move.l  a5,d3
  259.         move.l  a6,d2
  260.  
  261.         merge   d3,d4,d6,d7,$33333333,2
  262.         merge   d2,d5,d6,d7,$33333333,2
  263.  
  264.         merge   d4,d5,d6,d7,$55555555,1
  265.  
  266.         move.l  d5,(4*4,sp)     ;plane4
  267.         move.l  d4,(5*4,sp)     ;plane5
  268.  
  269.     endc
  270.  
  271.         adda.w  #32,a0
  272.         adda.w  #32,a2
  273.  
  274.         move.l  a1,(32,sp)      ; save output address
  275.         addq.l  #4,a1           ; skip 32 pixels on output
  276.  
  277.         cmpa.l  (40,sp),a0
  278.         bcc.w   final_case
  279.  
  280.  
  281. main_loop:
  282.     ifle depth-6
  283.         tst.w   (44,sp)     ; force_update?
  284.         bne.b   main_case
  285.     endc
  286.         cmpm.l  (a0)+,(a2)+ ; compare next 32 pixels
  287.         bne.b   mstub1
  288.         cmpm.l  (a0)+,(a2)+
  289.         bne.b   mstub2
  290.         cmpm.l  (a0)+,(a2)+
  291.         bne.b   mstub3
  292.         cmpm.l  (a0)+,(a2)+
  293.         bne.b   mstub4
  294.         cmpm.l  (a0)+,(a2)+
  295.         bne.b   mstub5
  296.         cmpm.l  (a0)+,(a2)+
  297.         bne.b   mstub6
  298.         cmpm.l  (a0)+,(a2)+
  299.         bne.b   mstub7
  300.         cmpm.l  (a0)+,(a2)+
  301.         bne.b   mstub8
  302.  
  303.         addq.l  #4,a1       ; skip 32 pixels on output
  304.  
  305.         cmpa.l  (40,sp),a0
  306.         bcs.b   main_loop
  307.         bra.w   final_case  ; exit if no more changes found
  308.  
  309. mstub8:     subq.l  #4,a0
  310.         subq.l  #4,a2
  311. mstub7:     subq.l  #4,a0
  312.         subq.l  #4,a2
  313. mstub6:     subq.l  #4,a0
  314.         subq.l  #4,a2
  315. mstub5:     subq.l  #4,a0
  316.         subq.l  #4,a2
  317. mstub4:     subq.l  #4,a0
  318.         subq.l  #4,a2
  319. mstub3:     subq.l  #4,a0
  320.         subq.l  #4,a2
  321. mstub2:     subq.l  #4,a0
  322.         subq.l  #4,a2
  323. mstub1:     subq.l  #4,a0
  324.         subq.l  #4,a2
  325.  
  326. main_case:  move.l  a1,(36,sp)  ; save current output address
  327.         move.l  (32,sp),a1  ; a1 = previous output address
  328.  
  329.     ifgt depth-6
  330.         move.l  (0,a0),d1
  331.         move.l  (4,a0),d3
  332.         move.l  (8,a0),d0
  333.         move.l  (12,a0),d2
  334.         move.l  (2,a0),d4
  335.         move.l  (10,a0),d5
  336.         move.l  (6,a0),d6
  337.         move.l  (14,a0),d7
  338.  
  339.         move.l  d1,(0,a2)
  340.         move.l  d3,(4,a2)
  341.         move.l  d0,(8,a2)
  342.         move.l  d2,(12,a2)
  343.  
  344.         move.w  (16,a0),d1
  345.         move.w  (24,a0),d0
  346.         move.w  (20,a0),d3
  347.         move.w  (28,a0),d2
  348.         move.w  (18,a0),d4
  349.         move.w  (26,a0),d5
  350.         move.w  (22,a0),d6
  351.         move.w  (30,a0),d7
  352.  
  353.         move.w  d1,(16,a2)
  354.         move.w  d0,(24,a2)
  355.         move.w  d3,(20,a2)
  356.         move.w  d2,(28,a2)
  357.         move.w  d4,(18,a2)
  358.         move.w  d5,(26,a2)
  359.         move.w  d6,(22,a2)
  360.         move.w  d7,(30,a2)
  361.  
  362.         move.l  d6,a5
  363.         move.l  d7,a6
  364.  
  365.         move.l  (0*4,sp),(a1)       ;plane0
  366.         adda.l  a3,a1           ;a1+=plsiz
  367.  
  368.         merge   d1,d0,d6,d7,$00ff00ff,8
  369.         merge   d3,d2,d6,d7,$00ff00ff,8
  370.  
  371.         move.l  (1*4,sp),(a1)       ;plane1
  372.         adda.l  a3,a1           ;a1+=plsiz
  373.  
  374.         merge   d1,d3,d6,d7,$0f0f0f0f,4 
  375.         merge   d0,d2,d6,d7,$0f0f0f0f,4
  376.  
  377.         exg d1,a5
  378.         exg d0,a6
  379.  
  380.         move.l  (2*4,sp),(a1)       ;plane2
  381.         adda.l  a3,a1           ;a1+=plsiz
  382.  
  383.         merge   d4,d5,d6,d7,$00ff00ff,8
  384.         merge   d1,d0,d6,d7,$00ff00ff,8
  385.  
  386.         move.l  (3*4,sp),(a1)       ;plane3
  387.         adda.l  a3,a1           ;a1+=plsiz
  388.  
  389.         merge   d4,d1,d6,d7,$0f0f0f0f,4
  390.         merge   d5,d0,d6,d7,$0f0f0f0f,4
  391.  
  392.         move.l  (4*4,sp),(a1)       ;plane4
  393.         adda.l  a3,a1           ;a1+=plsiz
  394.  
  395.         merge   d3,d1,d6,d7,$33333333,2
  396.         merge   d2,d0,d6,d7,$33333333,2 
  397.  
  398.         move.l  (5*4,sp),(a1)       ;plane5
  399.         adda.l  a3,a1           ;a1+=plsiz
  400.  
  401.         merge   d3,d2,d6,d7,$55555555,1
  402.         merge   d1,d0,d6,d7,$55555555,1
  403.  
  404.         move.l  d0,(0*4,sp)     ;plane0 (movem.l is slower!)
  405.         move.l  d1,(1*4,sp)     ;plane1
  406.         move.l  d2,(2*4,sp)     ;plane2
  407.         move.l  d3,(3*4,sp)     ;plane3
  408.  
  409.         move.l  a5,d3
  410.         move.l  a6,d2
  411.  
  412.         move.l  (6*4,sp),(a1)       ;plane6
  413.         adda.l  a3,a1           ;a1+=plsiz
  414.  
  415.         merge   d3,d4,d6,d7,$33333333,2
  416.         merge   d2,d5,d6,d7,$33333333,2
  417.  
  418.         move.l  (7*4,sp),(a1)       ;plane7
  419.         adda.l  a3,a1           ;a1+=plsiz
  420.  
  421.         merge   d3,d2,d6,d7,$55555555,1
  422.         merge   d4,d5,d6,d7,$55555555,1
  423.  
  424.         move.l  d5,(4*4,sp)     ;plane4
  425.         move.l  d4,(5*4,sp)     ;plane5
  426.  
  427.         move.l  d2,(6*4,sp)     ;plane6
  428.         move.l  d3,(7*4,sp)     ;plane7
  429.  
  430.     else            ; depth 6 code, xlate from 8-bit to 6-bit EHB
  431.         moveq   #0,d7
  432.  
  433.         move.l  (a0),(a2)
  434.         move.l  (4,a0),(4,a2)
  435.         move.l  (8,a0),(8,a2)
  436.         move.l  (12,a0),(12,a2)
  437.         move.l  (16,a0),(16,a2)
  438.         move.l  (20,a0),(20,a2)
  439.         move.l  (24,a0),(24,a2)
  440.         move.l  (28,a0),(28,a2)
  441.  
  442.         xlate   0,d1        ; does 8-bit to EHB colour translate
  443.         xlate   1,d0        ; 4 pixels at a time
  444.         xlate   4,d3
  445.         xlate   5,d2
  446.  
  447.         move.l  (0*4,sp),(a1)       ;plane0
  448.         adda.l  a3,a1           ;a1+=plsiz
  449.  
  450.         merge   d1,d3,d6,d7,$0f0f0f0f,4 
  451.         merge   d0,d2,d6,d7,$0f0f0f0f,4
  452.  
  453.         movea.l d1,a5
  454.         movea.l d0,a6
  455.  
  456.         moveq   #0,d7
  457.  
  458.         xlate   2,d4
  459.         xlate   3,d5
  460.         xlate   6,d1
  461.         xlate   7,d0
  462.  
  463.         move.l  (1*4,sp),(a1)       ;plane1
  464.         adda.l  a3,a1           ;a1+=plsiz
  465.  
  466.         merge   d4,d1,d6,d7,$0f0f0f0f,4
  467.         merge   d5,d0,d6,d7,$0f0f0f0f,4
  468.  
  469.         move.l  (2*4,sp),(a1)       ;plane2
  470.         adda.l  a3,a1           ;a1+=plsiz
  471.  
  472.         merge   d3,d1,d6,d7,$33333333,2
  473.         merge   d2,d0,d6,d7,$33333333,2 
  474.  
  475.         move.l  (3*4,sp),(a1)       ;plane3
  476.         adda.l  a3,a1           ;a1+=plsiz
  477.  
  478.         merge   d3,d2,d6,d7,$55555555,1
  479.         merge   d1,d0,d6,d7,$55555555,1
  480.  
  481.         move.l  d0,(0*4,sp)     ;plane0 (movem.l is slower!)
  482.         move.l  d1,(1*4,sp)     ;plane1
  483.         move.l  d2,(2*4,sp)     ;plane2
  484.         move.l  d3,(3*4,sp)     ;plane3
  485.  
  486.         move.l  (4*4,sp),(a1)       ;plane4
  487.         adda.l  a3,a1           ;a1+=plsiz
  488.  
  489.         move.l  a5,d3
  490.         move.l  a6,d2
  491.  
  492.         merge   d3,d4,d6,d7,$33333333,2
  493.  
  494.         move.l  (5*4,sp),(a1)       ;plane5
  495.         adda.l  a3,a1           ;a1+=plsiz
  496.  
  497.         merge   d2,d5,d6,d7,$33333333,2
  498.  
  499.         merge   d4,d5,d6,d7,$55555555,1
  500.  
  501.         move.l  d5,(4*4,sp)     ;plane4
  502.         move.l  d4,(5*4,sp)     ;plane5
  503.  
  504.     endc
  505.  
  506.         adda.w  #32,a0
  507.         adda.w  #32,a2
  508.  
  509.         movea.l (36,sp),a1  ; restore current output address
  510.         move.l  a1,(32,sp)  ; save output address
  511.  
  512.         addq.l  #4,a1       ; skip 32 pixels on output
  513.  
  514.         cmpa.l  (40,sp),a0
  515.         bcs.w   main_loop
  516.  
  517.  
  518. final_case: move.l  (32,sp),a1  ; a1 = previous output address
  519.  
  520.         move.l  (0*4,sp),(a1)       ;plane0
  521.         adda.l  a3,a1           ;a1+=plsiz
  522.         move.l  (1*4,sp),(a1)       ;plane1
  523.         adda.l  a3,a1           ;a1+=plsiz
  524.         move.l  (2*4,sp),(a1)       ;plane2
  525.         adda.l  a3,a1           ;a1+=plsiz
  526.         move.l  (3*4,sp),(a1)       ;plane3
  527.         adda.l  a3,a1           ;a1+=plsiz
  528.         move.l  (4*4,sp),(a1)       ;plane4 
  529.         adda.l  a3,a1           ;a1+=plsiz
  530.         move.l  (5*4,sp),(a1)       ;plane5
  531.     ifgt depth-6
  532.         adda.l  a3,a1           ;a1+=plsiz
  533.         move.l  (6*4,sp),(a1)       ;plane6
  534.         adda.l  a3,a1           ;a1+=plsiz
  535.         move.l  (7*4,sp),(a1)       ;plane7
  536.     endc
  537.  
  538. exit:       add.w   #46,sp
  539.         movem.l (sp)+,d2-d7/a2-a6
  540.         rts
  541.  
  542.         cnop    0,4
  543. end:
  544.  
  545.         end
  546.